﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Acceso_a_Datos.IDAOS;
using System.Data.SqlClient;
using Sistema_Totem.Clases;
using System.Data;
using Sistema_Totem.Clases.Fabricas;
using Sistema_Totem.Exepciones;
using Sistema_Totem.Acceso_a_Datos.Exepciones_A.Datos;

namespace Sistema_Totem.Acceso_a_Datos.DAOS
{
    public class DAOProyecto : DAOSQLServer, iDAOProyecto
    {
        #region Grupo Login y Proyecto

        #region Atributos

        private Conexion _conexion = new Conexion();
        private SqlCommand _comando = new SqlCommand();
        private SqlDataReader _lectorConsulta = null;
        private Entidad _miProyecto = FabricaEntidad.CrearProyecto();
        private List<Entidad> _proyectos = new List<Entidad>();

        #endregion Atributos

        #region Metodos

        #region AgregarProyecto

        /// <summary>
        /// Método que agrega un proyecto en la base de datos, se descomponen
        /// los atributos y el stored procedure se encarga de realizar la insercion
        /// en la base de datos.
        /// </summary>
        /// <param name="_entidad">La entidad Proyecto</param>
        /// <returns>true = insercion correcta</returns>
        /// <returns>false = insercion errada / caída en excepciones</returns>
        
        public bool AgregarProyecto(Entidad _entidad, Entidad _usuario)
        {
            try
            {
                _conexion.AbrirConexionBd();                

                _comando.Connection = _conexion.ObjetoConexion();                

                _comando.CommandType = CommandType.StoredProcedure;

                _comando.CommandText = "[dbo].[AgregarProyecto]";                

                _comando.CommandTimeout = 10;

                _comando.Parameters.AddWithValue("@codigoProyecto",(_entidad as Proyecto).Codigo);
                _comando.Parameters.AddWithValue("@nombreProyecto", (_entidad as Proyecto).Nombre);
                _comando.Parameters.AddWithValue("@fecha_iniProyecto", (_entidad as Proyecto).FechaIni);
                _comando.Parameters.AddWithValue("@fecha_finProyecto", (_entidad as Proyecto).FechaFin);
                _comando.Parameters.AddWithValue("@descripcionProyecto", (_entidad as Proyecto).Descripcion);
                _comando.Parameters.AddWithValue("@statusProyecto", (_entidad as Proyecto).Estado);
                _comando.Parameters.AddWithValue("@areaProyecto", (_entidad as Proyecto).Area);
                _comando.Parameters.AddWithValue("@idUsuario", (_usuario as Usuario).UserId);
                _comando.Parameters.AddWithValue("@tipoUsuario",(_usuario as Usuario).TipoUsuario);
                _comando.Parameters.AddWithValue("@idInsertado", 0);
                _comando.Parameters.AddWithValue("@idTipoUsuario",0);

                _comando.ExecuteReader();

                return true;
                
            }
            catch (SqlException)
            {
                throw new ErrorConexionException();
            }           
            finally
            {
                _conexion.CerrarConexionBd();
            }
        }

        #endregion AgregarProyecto

        #region ModificarProyecto

        /// <summary>
        /// Método que realiza la modificacion sobre el proyecto modificado en la vista, se descomponen
        /// los atributos y el stored procedure se encarga de realizar la modificacion en la base de datos.
        /// </summary>
        /// <param name="_entidad">la entidad Proyecto</param>
        /// <returns>true = modificacion realizada</returns>
        /// <returns>false = modificacion errada / caída en excepciones</returns>
        
        public bool ModificarProyecto(Entidad _entidad)
        {
            try
            {
                _conexion.AbrirConexionBd();

                _comando.Connection = _conexion.ObjetoConexion();

                _comando.CommandType = CommandType.StoredProcedure;

                _comando.CommandText = "[dbo].[ModificarProyectoCompleto]";

                _comando.CommandTimeout = 10;

                _comando.Parameters.AddWithValue("@codigoProyecto", (_entidad as Proyecto).Codigo);
                _comando.Parameters.AddWithValue("@nombreProyecto", (_entidad as Proyecto).Nombre);
                _comando.Parameters.AddWithValue("@fecha_iniProyecto", (_entidad as Proyecto).FechaIni);
                _comando.Parameters.AddWithValue("@fecha_finProyecto", (_entidad as Proyecto).FechaFin);
                _comando.Parameters.AddWithValue("@descripcionProyecto", (_entidad as Proyecto).Descripcion);
                _comando.Parameters.AddWithValue("@statusProyecto", (_entidad as Proyecto).Estado);
                _comando.Parameters.AddWithValue("@areaProyecto", (_entidad as Proyecto).Area);
                _comando.Parameters.AddWithValue("@idProyecto",(_entidad as Proyecto).IdProyecto);

                _comando.ExecuteReader();

                return true;

            }
            catch (SqlException)
            {
                throw new ErrorConexionException();
            }
            finally
            {
                _conexion.CerrarConexionBd();
            }
        }

        #endregion ModificarProyecto

        #region ConsultarProyecto

        /// <summary>
        /// Dado el id de un proyecto en particular se realiza la consulta contra base de datos
        /// </summary>
        /// <param name="_idProyecto">El id del proyecto</param>
        /// <returns>La entidad Proyecto</returns>
        
        public Entidad ConsultarProyecto(int _idProyecto)
        {
            try
            {
                _conexion.AbrirConexionBd();

                _comando.Connection = _conexion.ObjetoConexion();

                _comando.CommandType = CommandType.StoredProcedure;

                _comando.CommandText = "[dbo].[ConsultarProyectoCompleto]";
                _comando.Parameters.AddWithValue("@idProyecto", _idProyecto);
                _comando.CommandTimeout = 10;

                _lectorConsulta = _comando.ExecuteReader();

                while (_lectorConsulta.Read())
                {
                    (_miProyecto as Proyecto).Codigo = _lectorConsulta.GetString(1);
                    (_miProyecto as Proyecto).Nombre = _lectorConsulta.GetString(2);
                    (_miProyecto as Proyecto).FechaIni = _lectorConsulta.GetDateTime(3);
                    (_miProyecto as Proyecto).FechaFin = _lectorConsulta.GetDateTime(4);
                    (_miProyecto as Proyecto).Descripcion = _lectorConsulta.GetString(5);
                    (_miProyecto as Proyecto).Estado = _lectorConsulta.GetString(6);
                    (_miProyecto as Proyecto).Area = _lectorConsulta.GetString(7);
                }

                _lectorConsulta.Close();

            }
            catch (SqlException)
            {
                throw new ErrorConexionException();
            }
            finally
            {
                _conexion.CerrarConexionBd();
            }

            return _miProyecto;
            
        }

        #endregion ConsultarProyecto

        #region ConsultarProyectos

        /// <summary>
        /// Dado el id de un usuario se retornan todos los proyectos asociados a él
        /// </summary>
        /// <param name="_idUsuario">El id del usuario que esta conectado en la aplicación</param>
        /// <returns>Listado de entidades proyecto que cumplan con la condición</returns>
        
        public List<Entidad> ConsultarProyectos(int _idUsuario)
        {
            List<Entidad> _proyectos = new List<Entidad>();

            try
            {
                _conexion.AbrirConexionBd();

                _comando.Connection = _conexion.ObjetoConexion();

                _comando.CommandType = CommandType.StoredProcedure;

                _comando.CommandText = "[dbo].[ConsultarTodosLosProyectos]";
                _comando.Parameters.AddWithValue("@idUsuario", _idUsuario);
                _comando.CommandTimeout = 10;

                _lectorConsulta = _comando.ExecuteReader();                

                while (_lectorConsulta.Read())
                {
                    _miProyecto = FabricaEntidad.CrearProyecto();

                    (_miProyecto as Proyecto).Codigo = _lectorConsulta.GetString(1);
                    (_miProyecto as Proyecto).Nombre = _lectorConsulta.GetString(2);
                    (_miProyecto as Proyecto).FechaIni = _lectorConsulta.GetDateTime(3);
                    (_miProyecto as Proyecto).FechaFin = _lectorConsulta.GetDateTime(4);
                    (_miProyecto as Proyecto).Descripcion = _lectorConsulta.GetString(5);
                    (_miProyecto as Proyecto).Estado = _lectorConsulta.GetString(6);
                    (_miProyecto as Proyecto).Area = _lectorConsulta.GetString(7);

                    _proyectos.Add(_miProyecto); 
                }

                _lectorConsulta.Close();
                
            }
            catch (SqlException)
            {
                throw new ErrorConexionException();
            }
            finally                
            {
                _conexion.CerrarConexionBd(); 
            }

            if (_proyectos.Count == 0)
            {
                throw new ListadoVacioProyectosUsuarioException();
            }
            else

            return _proyectos;
        }

        #endregion ConsultarProyectos        

        #region ConsultarProyectoPorNombre

        public Entidad ConsultarProyectoPorNombre(string _nombreProyecto)
        {
            try
            {
                _conexion.AbrirConexionBd();

                _comando.Connection = _conexion.ObjetoConexion();

                _comando.CommandType = CommandType.StoredProcedure;

                _comando.CommandText = "[dbo].[ConsultarProyectoPorNombre ]";
                _comando.Parameters.AddWithValue("@nombreProyecto", _nombreProyecto);
                _comando.CommandTimeout = 10;

                _lectorConsulta = _comando.ExecuteReader();

                while (_lectorConsulta.Read())
                {
                    (_miProyecto as Proyecto).Codigo = _lectorConsulta.GetString(1);
                    (_miProyecto as Proyecto).Nombre = _lectorConsulta.GetString(2);
                    (_miProyecto as Proyecto).FechaIni = _lectorConsulta.GetDateTime(3);
                    (_miProyecto as Proyecto).FechaFin = _lectorConsulta.GetDateTime(4);
                    (_miProyecto as Proyecto).Descripcion = _lectorConsulta.GetString(5);
                    (_miProyecto as Proyecto).Estado = _lectorConsulta.GetString(6);
                    (_miProyecto as Proyecto).Area = _lectorConsulta.GetString(7);
                    (_miProyecto as Proyecto).IdProyecto = Convert.ToInt32(_lectorConsulta.GetDecimal(0));
                }

                _lectorConsulta.Close();

            }
            catch (SqlException)
            {
                throw new ErrorConexionException();
            }
            finally
            {
                _conexion.CerrarConexionBd();
            }

            return _miProyecto;
        }

        #endregion ConsultarProyectoPorNombre

        #endregion Métodos

        #endregion Grupo Login y Proyecto
   
    }
}